#!/bin/bash

# Use bash's pipefail option to get errors during failure in a command
# pipeline.  This is useful to get notified about an error from dbus-send
# when used with "|tail".
set -o pipefail

tty 2>&1 > /dev/null
ISATTY=$?

if [ "$ISATTY" = 0 ]
then
    # rlwrap provides readline functionality for "read", which is more enhanced
    # than bash's "read" itself.
    RLWRAP=$(which rlwrap 2>/dev/null)
    if [ "$RLWRAP" != "" ]
    then
        if [ "$A_RERUN" = "" ]
        then
            A_RERUN="no" exec $RLWRAP $0
        fi
        READ_CMD="read"
    else
        # No rlwrap: use bash's readline.
        READ_CMD="read -e"
    fi
fi

DBUS_SEND=dbus-send

which ${DBUS_SEND} > /dev/null
if test $? = 1
then
    echo "E: Unable to find" ${DBUS_SEND}
    exit 1
fi

DBUS_PATH=/
DBUS_DEST=org.naquadah.awesome.awful
DBUS_METHOD=${DBUS_DEST}.Remote.Eval

a_dbus_send()
{
    $DBUS_SEND --dest=$DBUS_DEST --type=method_call --print-reply \
        $DBUS_PATH $DBUS_METHOD string:"$1" | tail -n +2
    ret=$?
    if [ "$ret" != 0 ] && [ "$ISATTY" != 0 ]; then
        echo "E: $DBUS_SEND failed." >&2
        exit $ret
    fi
}

if [ "$ISATTY" = 0 ]
then
    while $READ_CMD -p "awesome# " -r line
    do
        if [ "$line" = "" ]; then
            continue
        fi
        a_dbus_send "$line"
    done
else
    a_dbus_send "$(cat)"
fi

# vim: filetype=sh:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
